#include "mate.h"
#include "ui_mate.h"
#include <QJsonParseError>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QDebug>

extern QString boxNumber;//箱子编号

Mate::Mate(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Mate)
{
    ui->setupUi(this);

    //设置窗口标题
    setWindowTitle("匹对结果");

    sign1=0;
    sign2=0;
    drugNames.clear();

    ui->label_3->setText(QString("%1").arg(boxNumber.toInt(), 2, 10, QLatin1Char('0')));//显示箱子编号
    initialize();//初始化界面
}

Mate::~Mate()
{
    delete ui;
}

//初始化界面
void Mate::initialize()
{
    QFont font;
    font.setFamily("MicrosoftYaHei");//设置字体
    //设置为粗体
    font.setBold(true);
    //字体大小
    font.setPointSize(10);

    {
        //设置常规药品字段名
        ui->tableWidget->setColumnCount(5); //设置列数为3
    //    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"药品名"<<"规格"<<"数量");

        //设置表格的行数
        ui->tableWidget->verticalHeader()->setVisible(false); //隐藏列表头
        ui->tableWidget->horizontalHeader()->setVisible(false); //隐藏行表头
        ui->tableWidget->setRowCount(1);

        //添加正文内容       
        QTableWidgetItem *qtwi=new QTableWidgetItem();
        qtwi->setText("药品");//设置单元格中的文本
        qtwi->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
        qtwi->setFont(font);//设置单元格中文本的字体
        ui->tableWidget->setItem(sign1,0,qtwi);

        QTableWidgetItem *qtwi2=new QTableWidgetItem();
        qtwi2->setText("规格");//设置单元格中的文本
        qtwi2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
        qtwi2->setFont(font);//设置单元格中文本的字体
        ui->tableWidget->setItem(sign1,1,qtwi2);

        QTableWidgetItem *qtwi3=new QTableWidgetItem();
        qtwi3->setText("手麻系统");//设置单元格中的文本
        qtwi3->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
        qtwi3->setFont(font);//设置单元格中文本的字体
        ui->tableWidget->setItem(sign1,2,qtwi3);

        QTableWidgetItem *qtwi4=new QTableWidgetItem();
        qtwi4->setText("智能药箱");//设置单元格中的文本
        qtwi4->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
        qtwi4->setFont(font);//设置单元格中文本的字体
        ui->tableWidget->setItem(sign1,3,qtwi4);

        sign1++;

        //设置每列长度
        ui->tableWidget->setColumnWidth(0,159);
        ui->tableWidget->setColumnWidth(1,80);
        ui->tableWidget->setColumnWidth(2,80);
        ui->tableWidget->setColumnWidth(3,80);
        ui->tableWidget->setColumnWidth(4,99);
//        ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);/* 自适应所有列，让它布满空间 */
        ui->tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏上下滚动条
        ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏左右滚动条
        ui->tableWidget->setFocusPolicy(Qt::NoFocus);//解决选中虚框问题(选中后变灰一点)
    }

    {
        //设置常规药品字段名
        ui->tableWidget_2->setColumnCount(3); //设置列数为3
    //    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"药品名"<<"规格"<<"数量");

        //设置表格的行数
        ui->tableWidget_2->verticalHeader()->setVisible(false); //隐藏列表头
        ui->tableWidget_2->horizontalHeader()->setVisible(false); //隐藏行表头
        ui->tableWidget_2->setRowCount(1);

        //添加正文内容
        QTableWidgetItem *qtwi=new QTableWidgetItem();
        qtwi->setText("器械名称");//设置单元格中的文本
        qtwi->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
        qtwi->setFont(font);//设置单元格中文本的字体
        ui->tableWidget_2->setItem(sign2,0,qtwi);

        QTableWidgetItem *qtwi2=new QTableWidgetItem();
        qtwi2->setText("规格");//设置单元格中的文本
        qtwi2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
        qtwi2->setFont(font);//设置单元格中文本的字体
        ui->tableWidget_2->setItem(sign2,1,qtwi2);

        QTableWidgetItem *qtwi3=new QTableWidgetItem();
        qtwi3->setText("数量");//设置单元格中的文本
        qtwi3->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
        qtwi3->setFont(font);//设置单元格中文本的字体
        ui->tableWidget_2->setItem(sign2,2,qtwi3);

        sign2++;

        //设置每列长度
        ui->tableWidget_2->setColumnWidth(0,200);
        ui->tableWidget_2->setColumnWidth(1,149);
        ui->tableWidget_2->setColumnWidth(2,149);

//        ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);/* 自适应所有列，让它布满空间 */
        ui->tableWidget_2->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏上下滚动条
        ui->tableWidget_2->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏左右滚动条
        ui->tableWidget_2->setFocusPolicy(Qt::NoFocus);//解决选中虚框问题(选中后变灰一点)
    }
}

//解析药箱传过来的药品信息
void Mate::setBoxDrug(QString BoxDrug, QJsonArray settingTable, QJsonArray NFCtable)
{
    QString oversendBuf = BoxDrug;
    oversendBuf=oversendBuf.replace("oversend:","");
    oversendBuf=oversendBuf.replace("xxxxxxxxxx","");
    oversendBuf=oversendBuf.replace("\r\n","");
    oversendBuf=oversendBuf.replace("\r","");
    oversendBuf=oversendBuf.replace("'","\"");

    // QJsonParseError类用于在JSON解析期间报告错误。
    QJsonParseError jsonError;
    // 将json解析为UTF-8编码的json文档，并从中创建一个QJsonDocument。
    // 如果解析成功，返回QJsonDocument对象，否则返回null
    QJsonDocument doc = QJsonDocument::fromJson(oversendBuf.toUtf8(), &jsonError);
    // 判断是否解析失败
    if (jsonError.error != QJsonParseError::NoError && !doc.isNull())
    {
        qDebug()<<__LINE__ << "Json格式错误！" << jsonError.error;
        return;
    }

    // 转换为QJsonArray类型
    QJsonArray colorArray = doc.array();

    if(colorArray.size() < 2)
    {
        qDebug()<<__LINE__<<"接受数据错误  退出数据处理";
        return;
    }
    QJsonArray DrugInfo=colorArray.at(0).toArray(); //解析出所有药箱使用药品信息
    QJsonArray NfcInfo=colorArray.at(1).toArray();  //解析出所有药箱使用NFC扫描机械耗材信息
//    qDebug()<<__LINE__<<"DrugInfo="<<DrugInfo;

    drugNames.clear();
    int ifFirst = 0;
    //查找使用药品名称规格
    for(int i=0; i<DrugInfo.size(); i++)
    {
        for(int j=0;j<settingTable.size();j++)
        {
            QJsonObject obj1=settingTable.at(settingTable.size()-j-1).toObject();

            QJsonValue val1=obj1.value("position");
            //名称
            QJsonValue val2=obj1.value("name");
            //大小
            QJsonValue val3=obj1.value("size");
            //单位
            QJsonValue val4=obj1.value("sizeUnit");
            //类别
            QJsonValue val5=obj1.value("type");

            if(val1.toString() == DrugInfo.at(i).toString())
            {
                for(int m=0; m<drugNames.size(); m++)
                {
                    if(drugNames.at(m) == QString("%1@%2%3").arg(val2.toString()).arg(val3.toInt()).arg(val4.toString()))
                    {
                        ifFirst = 1;
                        NumberDrugs[m]++;
                        break;
                    }
                }
                if((ifFirst==0) && (!val2.toString().isEmpty()))
                {
                    drugNames.append(QString("%1@%2%3").arg(val2.toString()).arg(val3.toInt()).arg(val4.toString()));
                    NumberDrugs[drugNames.size()-1] = 1;
                }
                else
                {
                    ifFirst = 0;
                }
                break;
            }
        }

    }

    qDebug()<<__LINE__<<"drugNames="<<drugNames;

    //解析机械耗材
//    QStringList useNFCtable;//记录所有的机械耗材
    QString NfcName;//nfc标记
    QString NfcModel;//nfc型号
    int NfcNameModelNumber[200]={0};//记录每个种类机械耗材数量

    for(int i=0;i<NfcInfo.size();i++)
    {
//        int sign=0;
        for(int j=0;j<NFCtable.size();j++)
        {
            QJsonObject  obj1=NFCtable.at(j).toObject();
            //名称
            QJsonValue val2=obj1.value("name");
            //标记
            QJsonValue val3=obj1.value("mark");
            //型号
            QJsonValue val4=obj1.value("unit");

            if(NfcInfo.at(j).toString().contains(val3.toString()))
            {
                NfcNameModelNumber[j]++;
//                sign=1;
                break;
            }
        }
//        if(sign==0)
//        {
//            NfcName="未知";
//            NfcNameModelNumber[NfcInfo.size()]++;
//        }
    }
    for(int i=0;i<NFCtable.size();i++)
    {
        if(NfcNameModelNumber[i]>0)
        {
            int iRow = ui->tableWidget_2->rowCount();
            ui->tableWidget_2->setRowCount(iRow + 1);//总行数增加1

            QJsonObject  obj1=NFCtable.at(i).toObject();
            //名称
            QJsonValue val2=obj1.value("name");
            //标记
            QJsonValue val3=obj1.value("mark");
            //型号
            QJsonValue val4=obj1.value("unit");
            NfcName=val2.toString();
            NfcModel=val4.toString();

            //添加正文内容
            QTableWidgetItem *qtwi=new QTableWidgetItem();
            qtwi->setText(NfcName);//设置单元格中的文本
            qtwi->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
            ui->tableWidget_2->setItem(sign2,0,qtwi);

            QTableWidgetItem *qtwi2=new QTableWidgetItem();
            qtwi2->setText(NfcModel);//设置单元格中的文本
            qtwi2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
            ui->tableWidget_2->setItem(sign2,1,qtwi2);

            QTableWidgetItem *qtwi3=new QTableWidgetItem();

            qtwi3->setText(QString::number(NfcNameModelNumber[i]));//设置单元格中的文本
            qtwi3->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
            ui->tableWidget_2->setItem(sign2,2,qtwi3);

            sign2++;
        }
    }
}

//设置核对信息(患者信息,手麻系统药品信息,药箱药品信息)
void Mate::setCheckInfo(QJsonObject patient, QString HandDrug, QString BoxDrug, QJsonArray settingTable, QJsonArray NFCtable)
{
    qDebug()<<__LINE__<<"解析患者信息";
    QString P_name = patient.value("P_name").toString();
    QString P_sex = patient.value("P_sex").toString();
    QString Blood_t = patient.value("Blood_t").toString();
    QString P_age = patient.value("P_age").toString();
    QString P_idnum = patient.value("P_idnum").toString();
    QString An_mt = patient.value("An_mt").toString();
    QString Op_name = patient.value("Op_name").toString();

    ui->label_6->setText(P_name);
    ui->label_8->setText(P_sex);
    ui->label_10->setText(Blood_t);
    ui->label_12->setText(P_age);
    ui->label_13->setText(P_idnum);
    ui->label_15->setText(An_mt);
    ui->label_17->setText(Op_name);

    // QJsonParseError类用于在JSON解析期间报告错误。
    QJsonParseError jsonError;
    // 将json解析为UTF-8编码的json文档，并从中创建一个QJsonDocument。
    // 如果解析成功，返回QJsonDocument对象，否则返回null
    QJsonDocument doc = QJsonDocument::fromJson(HandDrug.toUtf8(), &jsonError);
    // 判断是否解析失败
    if (jsonError.error != QJsonParseError::NoError && !doc.isNull()) {
        qDebug() << "Json格式错误！" << jsonError.error;
        return;
    }

    drugNames2.clear();
    QJsonArray colorArray = doc.array();
    qDebug()<<__LINE__<<colorArray<<colorArray.size();
    for (int i = 0; i < colorArray.size(); i++)
    {
        QJsonObject color = colorArray.at(i).toObject();
        QString drugNum=color.value("drugNum").toString();//药品数量
        QString drugName;//药品名称
        QString drugSize;//药品规格
        QString value=color.value("value").toString();//药品名字+规格
        QStringList valueList=value.split("(");

        if(valueList.size()>=2)
        {
            drugName=valueList.at(0);
            drugSize=valueList.at(1);
            drugSize=drugSize.replace(")","");
        }
        else
        {
            if(valueList.size()==0)
            {
                drugName=valueList.at(0);
                drugSize="";
            }
            if(valueList.size()==1)
            {
                drugName="";
                drugSize="";
            }
        }

        if(drugName.isEmpty())
        {
            continue;
        }

        int iRow = ui->tableWidget->rowCount();
        ui->tableWidget->setRowCount(iRow + 1);//总行数增加1
        //添加正文内容
        QTableWidgetItem *qtwi=new QTableWidgetItem();
        qtwi->setText(drugName);//设置单元格中的文本
        qtwi->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
        ui->tableWidget->setItem(sign1,0,qtwi);

        QTableWidgetItem *qtwi2=new QTableWidgetItem();
        qtwi2->setText(drugSize);//设置单元格中的文本
        qtwi2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
        ui->tableWidget->setItem(sign1,1,qtwi2);

        QTableWidgetItem *qtwi3=new QTableWidgetItem();
        qtwi3->setText(drugNum);//设置单元格中的文本
        qtwi3->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
        ui->tableWidget->setItem(sign1,2,qtwi3);
        sign1++;

        drugNames2.append(QString("%1@%2").arg(drugName).arg(drugSize));
        NumberDrugs2[i] = drugNum.toInt();
    }

    qDebug()<<__LINE__<<"解析药箱传过来的药品信息";
    setBoxDrug(BoxDrug, settingTable, NFCtable);//解析药箱传过来的药品信息

    int ifFirst = 0;
    for(int i=0; i<drugNames.size(); i++)
    {
        ifFirst = 0;
        for(int j=0; j<drugNames2.size(); j++)
        {
qDebug()<<__LINE__<<"drugNames.at(i)="<<drugNames.at(i)<<"drugNames2.at(i)="<<drugNames2.at(j);
            if(drugNames.at(i) == drugNames2.at(j))
            {
                ifFirst = 1;
                NumberDrugs3[j+1] = NumberDrugs[i];

                QTableWidgetItem *qtwi4=new QTableWidgetItem();
                qtwi4->setText(QString::number(NumberDrugs[i]));//设置单元格中的文本
                qtwi4->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
                ui->tableWidget->setItem(j+1,3,qtwi4);
qDebug()<<__LINE__<<"NumberDrugs[i]="<<NumberDrugs[i]<<"  NumberDrugs2[i]="<<NumberDrugs2[j];
                if(NumberDrugs[i] == NumberDrugs2[j])
                {
                    QLabel *label = new QLabel("");
                    label->setPixmap(QPixmap(":/new/prefix1/resource/2.png").scaled(30,30));
                    label->setAlignment(Qt::AlignCenter);//图片居中显示
                    ui->tableWidget->setCellWidget(j+1,4,label);
                }
                else
                {
                    QLabel *label = new QLabel("");
                    label->setStyleSheet("background-color: rgb(249,234,201);");//增加显示图片背景颜色
                    label->setPixmap(QPixmap(":/new/prefix1/resource/1.png").scaled(30,30));
                    label->setAlignment(Qt::AlignCenter);//图片居中显示
                    ui->tableWidget->setCellWidget(j+1,4,label);

                    //设置该行表格背景颜色
                    for(int m=0; m<4; m++)
                    {
                        ui->tableWidget->item(j+1, m)->setBackground(QColor(249,234,201));
                    }
                }
                break;
            }
        }
        if(ifFirst == 0)
        {
            QStringList myList = drugNames.at(i).split("@");
            QString drugName = myList.at(0);
            QString drugSize = myList.at(1);

            int iRow = ui->tableWidget->rowCount();
            ui->tableWidget->setRowCount(iRow + 1);//总行数增加1
            //添加正文内容
            QTableWidgetItem *qtwi=new QTableWidgetItem();
            qtwi->setText(drugName);//设置单元格中的文本
            qtwi->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
            ui->tableWidget->setItem(sign1,0,qtwi);

            QTableWidgetItem *qtwi2=new QTableWidgetItem();
            qtwi2->setText(drugSize);//设置单元格中的文本
            qtwi2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
            ui->tableWidget->setItem(sign1,1,qtwi2);

            QTableWidgetItem *qtwi3=new QTableWidgetItem();
            qtwi3->setText("0");//设置单元格中的文本
            qtwi3->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
            ui->tableWidget->setItem(sign1,2,qtwi3);

            QTableWidgetItem *qtwi4=new QTableWidgetItem();
            qtwi4->setText(QString::number(NumberDrugs[i]));//设置单元格中的文本
            qtwi4->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
            ui->tableWidget->setItem(sign1,3,qtwi4);

            QLabel *label = new QLabel("");
            label->setStyleSheet("background-color: rgb(249,234,201);");//增加显示图片背景颜色
            label->setPixmap(QPixmap(":/new/prefix1/resource/1.png").scaled(25,25));
            label->setAlignment(Qt::AlignCenter);//图片居中显示
            ui->tableWidget->setCellWidget(sign1,4,label);

            //设置该行表格背景颜色
            for(int j=0; j<4; j++)
            {
                ui->tableWidget->item(sign1, j)->setBackground(QColor(249,234,201));
            }

            NumberDrugs3[sign1] = NumberDrugs[i];
            sign1++;
        }
    }
qDebug()<<__LINE__<<"sign1="<<sign1;
    for(int i=1; i<sign1; i++)
    {
        if(NumberDrugs3[i] == 0)
        {
            QTableWidgetItem *qtwi4=new QTableWidgetItem();
            qtwi4->setText("0");//设置单元格中的文本
            qtwi4->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
            ui->tableWidget->setItem(i,3,qtwi4);

            QLabel *label = new QLabel("");
            label->setStyleSheet("background-color: rgb(249,234,201);");//增加显示图片背景颜色
            label->setPixmap(QPixmap(":/new/prefix1/resource/1.png").scaled(25,25));
            label->setAlignment(Qt::AlignCenter);//图片居中显示
            ui->tableWidget->setCellWidget(i,4,label);

            //设置该行表格背景颜色
            for(int j=0; j<4; j++)
            {
                ui->tableWidget->item(i, j)->setBackground(QColor(249,234,201));
            }
        }
    }

//    int iRow = ui->tableWidget->rowCount();
//    for(int i=1; i<iRow; i++)
//    {
//        // 先判断指向该item的指针是否为空 || 判断该item的text是否为空
//        if(ui->tableWidget->item(i,3)==nullptr || ui->tableWidget->item(i,3)->text().isEmpty())
//        {
//            QTableWidgetItem *qtwi4=new QTableWidgetItem();
//            qtwi4->setText("0");//设置单元格中的文本
//            qtwi4->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置单元格中文本的对齐方式
//            ui->tableWidget->setItem(i,3,qtwi4);

//            QLabel *label = new QLabel("");
//            label->setStyleSheet("background-color: rgb(249,234,201);");//增加显示图片背景颜色
//            label->setPixmap(QPixmap(":/new/prefix1/resource/1.png").scaled(30,30));
//            label->setAlignment(Qt::AlignCenter);//图片居中显示
//            ui->tableWidget->setCellWidget(i,4,label);

//            //设置该行表格背景颜色
//            for(int j=0; j<4; j++)
//            {
//                ui->tableWidget->item(i, j)->setBackground(QColor(249,234,201));
//            }

//        }
//    }
}
